package com.example.xd.javatest.factory_test;

import com.example.xd.javatest.factory_test.method.AudiFactory;
import com.example.xd.javatest.factory_test.method.BydFactory;
import com.example.xd.javatest.factory_test.sample.CarFactory;
import com.example.xd.javatest.factory_test.sample.CarFactory2;

/**
 * @auther XuDan on 2020/6/16.
 * 简单工厂模式
 * 工厂方法模式
 * 抽象工厂模式
 * <p>
 * 工厂模式:创建者和调用者分离
 * <p>
 * 面向对象原则:开闭原则------>对扩展开放对修改关闭
 * 依赖倒转原则--->
 * 迪米特法则----->
 */
public class Client {
    public static void main(String[] args) {
//        test1();
//        test2();
        test3();

    }

    private static void test3() {
        Car byd = new BydFactory().createCar();
        Car audi = new AudiFactory().createCar();
        byd.run();
        audi.run();


    }

    /**
     * 简单工厂模式
     * 调用者只需知道CarFactory和Car
     */
    private static void test2() {
        Car audi = CarFactory.createCar("奥迪");
        Car byd = CarFactory.createCar("比亚迪");
        audi.run();
        byd.run();

        Car audi1 = CarFactory2.createAudi();
        Car byd1 = CarFactory2.createByd();
        audi1.run();
        byd1.run();
    }

    /**
     * 没有工厂模式
     * 调用者需要知道Car Audi Byd
     */
    private static void test1() {
        Car c1 = new Audi();
        Car c2 = new Byd();
        c1.run();
        c2.run();
    }
}
